/*
 * PlanetaA.cpp
 *
 *  Created on: Mar 31, 2010
 *      Author: jgrande
 */

#include <iostream>
#include <sstream>

#include "../../Aplicacion/Common/InformacionCreacionUniverso.h"

#include "../../Aplicacion/Modelo/Common/InformacionPlaneta.h"

#include "../../Aplicacion/Infraestructura/Directorio.h"
#include "../../Aplicacion/Infraestructura/DirectorioImpl.h"

#include "../../Framework/IO/log.h"
#include "../../Framework/Common/utiles.h"

#include "../../Middleware/Comunicaciones/MiddlewareCliente.h"

using aplicacion::DirectorioSingleton;
using aplicacion::Directorio;
using aplicacion::InformacionCreacionUniverso;
using aplicacion::InformacionPlaneta;

void sigint_handler(int signal) {
	MiddlewareClienteSingleton::instance().finish();
	exit(0);
}

bool registrarPlaneta(InformacionCreacionUniverso& u,
		InformacionPlaneta& p) {
	Directorio& dir = DirectorioSingleton::instance();

	u._idUniverso = 1; // esto puede que tenga que cambiarlo

	// acá debería completar la información del planeta, que todavía
	// no la estoy usando para nada

	logger << "Presione ENTER para registrar el planeta" << logger.endl;
	getchar();

	return dir.add(u, p);
}

bool main_loop() {
	MiddlewareCliente& mw = MiddlewareClienteSingleton::instance();
	int i = 1;

	logger << "presione ENTER para enviar un mensaje, q para salir" << logger.endl;
	while(getchar()!='q') {
		std::stringstream ss;

		ss << "Soy el planeta B mandando mi mensaje numero " << i++ << "\n";
		mw.send((char*)ss.str().c_str(), ss.str().length()+1, DIR_MULTICAST);
	}

	return true;
}

int main(int argc, char* argv[]) {
	InformacionCreacionUniverso u;
	InformacionPlaneta p;

	if(!MiddlewareClienteSingleton::instance().start()) {
		logger << "error inicializando middleware" << logger.endl;
		return 1;
	}

	Utiles::registrar_signal(SIGINT, sigint_handler);

	if(!registrarPlaneta(u, p)) {
		logger << "error registrando planeta" << logger.endl;
		return 1;
	}

	main_loop();

	MiddlewareClienteSingleton::instance().finish();

	return 0;
}
